package br.ufes.ceunes.poo.model.DAO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Scanner;

import javax.swing.JOptionPane;

import br.ufes.ceunes.poo.model.pojo.Cliente;
import br.ufes.ceunes.poo.model.pojo.Item;
import br.ufes.ceunes.poo.model.pojo.Pedido;

public class PedidoDAO {
        private int idPedido = 0;
	private static final String arquivo = "pedidos.txt";
        private static PedidoDAO instancia = null;
        private ArrayList<Pedido> pedidos =null;
        public PedidoDAO(){
            this.pedidos = new ArrayList<Pedido>();
        }
        public ArrayList<Pedido> getPedidos(){
            return this.pedidos;
        }
        public static synchronized PedidoDAO getInstancia(){
            if(instancia == null){
               instancia = new PedidoDAO();
            }
            return instancia;
        }

    /**
     *
     * @param nomeCliente
     * @param itens
     * @param quant
     */
    public void cadastrarPedido(String nomeCliente,ArrayList<Item> itens,ArrayList<Integer> quant) {
		Pedido pedido = new Pedido(ClienteDAO.getIntancia().acharClienteNome(nomeCliente));
		pedido.setSituacao(0);
                this.idPedido++;
		pedido.setCodigo(this.idPedido);
		int i;
                pedido.setItens(itens);
                pedido.setQuantidade(quant);
                Calendar datEmissao = Calendar.getInstance();
		String data = datEmissao.getTime().toString();
		pedido.setDataEmissao(data);
		this.pedidos.add(pedido);
	}
	public void lerPedidoArquivo(){
            int i,j,qt,cont;
            String data,cpfCli,idPed,situacao;
            Scanner sc;
            try{  
                sc = new Scanner(new FileReader(new File(arquivo))); 
                while(sc.hasNext()){
                    String valor = sc.nextLine();
                    this.idPedido = Integer.parseInt(valor);
                    valor = sc.nextLine();
                    qt = Integer.parseInt(valor);
                    for(i=0;i<qt;i++){
            		idPed = sc.nextLine();
                        situacao = sc.nextLine();
            		cpfCli = sc.nextLine();
            		data = sc.nextLine();
            		j = Integer.parseInt(sc.nextLine());
            		int[] idIt = new int[j];
            		Double[] valores = new Double[j];
            		Integer[] quant = new Integer[j];
            		for(cont=0;cont<j;cont++){
            			idIt[cont] = Integer.parseInt(sc.nextLine());
            			quant[cont] = Integer.parseInt(sc.nextLine());
                 	}
            		adicionarPedidoArquivo(idPed,ClienteDAO.getIntancia().acharClienteCpf(cpfCli),data,idIt,valores,quant,situacao);
                    }
                }
            }catch (FileNotFoundException e){ 
        	try {  
        	     File file = new File("arquivo");  
        	     boolean success = file.createNewFile();  
        	     if (success) {  
        	     } else {  
        	     }  
        	 } catch (IOException ee) {  
            JOptionPane.showMessageDialog(null, "Erro ao Criar "+arquivo);
            }
        } 
    }
	private void adicionarPedidoArquivo(String idNFS, Cliente achaClienteCpf, String data,
			int[] idIt, Double[] valores, Integer[] quant,String sit) {
		Pedido ped = new Pedido(achaClienteCpf);
		ped.setDataEmissao(data);
                ped.setSituacao(Integer.parseInt(sit));
		ped.setCodigo(Integer.parseInt(idNFS));
		int i;
                ArrayList<Integer> quantidade = new ArrayList<Integer>();
                ArrayList<Item> it = new ArrayList<Item>();
		for(i=0;i<idIt.length;i++){
			it.add(ItemDAO.getIntancia().acharItemId(idIt[i]));
			quantidade.add(quant[i]);
		}
                ped.setItens(it);
                ped.setQuantidade(quantidade);
		pedidos.add(ped);
		
	}
	public void gravarArquivoPedido(){
            String texto;
            int i,j;
            ArrayList<Item> it;
            ArrayList<Integer> quant;
            ArrayList<Double> valores;
            Cliente cli;
            try{
                File arquivu = new File(arquivo);
                try (FileOutputStream fos = new FileOutputStream(arquivu)) {
                    texto = this.idPedido+"\r\n";
                    fos.write(texto.getBytes());
                    texto = this.pedidos.size()+"\r\n";
                    fos.write(texto.getBytes());
                    for(i = 0;i<this.pedidos.size();i++)
                    {
                        texto = this.pedidos.get(i).getCodigo()+"\r\n";
                        fos.write(texto.getBytes());
                        texto = this.pedidos.get(i).getSituacao()+"\r\n";
                        fos.write(texto.getBytes());
                        cli = this.pedidos.get(i).getCliente();
                        texto = cli.getCpf()+"\r\n";
                        fos.write(texto.getBytes());
                        texto = this.pedidos.get(i).getDataemissao()+"\r\n";
                        fos.write(texto.getBytes());
                        it = this.pedidos.get(i).getItens();
                        quant = this.pedidos.get(i).getQuantidade();
                        texto = it.size()+"\r\n";
                        fos.write(texto.getBytes());
                        for(j=0;j<it.size();j++){
                            texto = it.get(i).getIdItem()+"\r\n";
                            fos.write(texto.getBytes());
                            texto = quant.get(j)+"\r\n";
                            fos.write(texto.getBytes());
                        }
                    }
                }
            }catch (IOException ee){ 
                System.out.println("Erro ao salvar arquivo em "+arquivo);
            }
			
        }
        public void mudaSituacao(int ped) {
                Pedido pedido = PedidoDAO.getInstancia().getPedidos().get(ped);
                ArrayList<Item> itensPedido = pedido.getItens();
                ArrayList<Integer> quant;
                quant = pedido.getQuantidade();
		for(int i=0;i<itensPedido.size();i++)
		{
			itensPedido.get(i).setQuantidade(-quant.get(i));
		}
		pedido.setSituacao(1);
	}
	public void carcelarPedido(Pedido pedido){
		pedido.setSituacao(2);
	}

    /**
     *
     * @param pedidos
     * @param id
     * @return
     */
    public Pedido pedidoPorId(ArrayList<Pedido> pedidos, int id) {
		int i;
		for(i=0;i<pedidos.size();i++)
		{
			if(pedidos.get(i).getCodigo()==id)
				return pedidos.get(i);
		}
		return null;
	}

    /**
     *
     * @param pedido
     * @param nome
     * @return
     */
    public int verificaItem(Pedido pedido, String nome) {
		ArrayList<Item> item = pedido.getItens();
		int i;
		for(i=0;i<item.size();i++)
		{
			if(item.get(i).getNome().equals(nome))return 1;
		}
		return 0;
	}
	public void alteraQuantidadeItemPedido(Pedido pedido,
			String opcao, String nome) {
		int i;
		String nomeItem;
		ArrayList<Item> item = pedido.getItens();
		for(i=0;i<item.size();i++){
			nomeItem=item.get(i).getNome();
			if(nomeItem.equals(nome)){
				pedido.setQuantidadeI(opcao,i);
			}
		}
	}
	public void addItensPedido(Pedido pedido,
			ArrayList<String> item, ArrayList<Integer> quant,ArrayList<Item> it) {
		int i;
		for(i=0;i<item.size();i++)
		{
			pedido.getItens().add((ItemDAO.getIntancia().acharItemNome(item.get(i))));
			pedido.getQuantidade().add(quant.get(i));
		}
	}
}

